#include <stdio.h>

// 找到了返回1，否则返回0表示已有序
int findmn(int *arr, int size, int *pm, int *pn)
{
    int m, n;
    int i;
    int found;

    // 从前往后找m，发现颠倒后开始记录最小值
    found = 0;
    for (i = 1; i < size; ++i) {
        if (found) {
            if (arr[i] < m)
                m = arr[i];
        } else {
            // 发现后一个比前一个小的情况
            if (arr[i] < arr[i - 1]) {
                found = 1;
                m = arr[i];
            }
        }
    }
    // 没发现，已有序
    if (!found) {
        return 0;
    }
    // 从头开始找第一个值比m大的数的下标，即所求m
    for (i = 0; i < size; ++i) {
        if (arr[i] > m) {
            *pm = i;
            break;
        }
    }

    // 从后往前找n，发现颠倒后开始记录最大值
    found = 0;
    for (i = size - 2; i >= 0; --i) {
        if (found) {
            if (arr[i] > n)
                n = arr[i];
        } else {
            // 发现前一个比后一个大的情况
            if (arr[i] > arr[i + 1]) {
                found = 1;
                n = arr[i];
            }
        }
    }
    // 没发现n，说明倒序
    if (!found) {
        *pm = 0;
        *pn = size - 1;
        return 1;
    }
    // 从后向前找第一个值比n小的数的下标，即所求n
    for (i = size - 1; i >= 0; --i) {
        if (arr[i] < n) {
            *pn = i;
            break;
        }
    }

    return 1;
}


int main()
{
    int arr[] = {1, 2, 4, 7, 10, 11, 7, 12, 6, 7, 16, 18, 19};
    int size = sizeof(arr)/sizeof(int);

    int m, n;
    int f = findmn(arr, size, &m, &n);

    if (f) {
        printf("%d, %d\n", m, n);
    } else {
        printf("%s\n", "已经有序");
    }
    
    return 0;
}
